#!/bin/bash


#
#@copyright Copyright (c) 2025 CSG Digital Grid Technology (Guangdong) Co., Ltd.
#@author Huang  Jiaqi
#



GREEN='\033[0;32m' # 绿色
YELLOW='\033[33m'  # 黄色
RED='\e[31m'       # 红色
NC='\033[0m'       # 重置颜色

pack="PES_pack_v1_241218"
echo -e "${GREEN}$pack${NC}"
echo ""

# 恢复终端的退格删除字符
stty erase '^H'

# 提示输入安装包位置
echo "请输入安装包位置"
read -e path


##################################################### 文件内容验证 ###############################################################


if [ ! -d "$path" ]; then
    echo "路径异常：$path 不存在或无法访问。"
    exit 1
fi

if [ ! -d "$path/package" ]; then
    echo "package 文件夹不存在或无法访问。"
    exit 1
fi

if [ ! -f "$path/start.sh" ]; then
    echo "start.sh 文件不存在或无法访问。"
    exit 1
fi

items=$(find "$path"/package -mindepth 1)
# 文件夹/package目录里预设3种文件，名字带.rpm的文件，名字不带.rpm的文件，文件夹。
# 用于记录是否存在文件夹
has_folder=false

# 用于记录是否存在名字带.rpm的文件
has_rpm=false

# 用于记录是否存在名字不带.rpm的文件
has_not_rpm=false

# 遍历查找到的所有项
for item in $items; do
    if [ -d $item ]; then
        has_folder=true
    elif [[ $item == *.rpm ]]; then
        has_rpm=true
    elif [[ $item != *.rpm ]]; then
        has_not_rpm=true
    fi
done

if [ -z "$items" ]; then
    echo "package下文件异常"
    exit 1
fi

# 文件夹/userdata/tmp/*/package目录里预设3种文件，名字带.rpm的文件，名字不带.rpm的文件，文件夹。
# 如果包含有文件、文件夹以及rpm包，则输出文件类型异常。
# 如果包含有文件以及rpm包，则输出文件类型异常。
# 如果全是有文件夹以及rpm包，则输出文件类型异常。

# 如果全是名字带.rpm的文件则执行rpmm函数。
# 如果没有名字带.rpm的文件且有文件夹则执行cpp函数。
# 如果没有名字带.rpm的文件且有文件夹和文件则执行cpp函数。

if $has_folder && $has_rpm && $has_not_rpm; then
    echo "error 有文件、文件夹以及rpm包"
	echo "PES_appm仅支持纯rpm包以及文件夹&文件两种打包形式"
    exit 1
elif $has_not_rpm && $has_rpm; then
    echo "error 有文件以及rpm包"
	echo "PES_appm仅支持纯rpm包以及文件夹&文件两种打包形式"
    exit 1
elif $has_folder && $has_rpm; then
    echo "error 有文件夹以及rpm包"
	echo "PES_appm仅支持纯rpm包以及文件夹&文件两种打包形式"
    exit 1
elif $has_rpm &&! $has_folder &&! $has_not_rpm; then
#     echo "rpmm"
	type=rpm
elif ! $has_rpm && $has_folder; then
#     echo "cpp"
	type=cp
elif ! $has_rpm && $has_not_rpm; then	
# 	echo "cpp"
	type=cp
	
	fi


##################################################### version内容输入 ###############################################################


# 创建 version.txt 文件
touch "$path/new_version.txt"

# 应用创建时间
# date > "$path/new_version.txt"
echo "$pack" > "$path/new_version.txt"
echo "创建时间：$(date)" >> "$path/new_version.txt"

# 应用名称(默认为文件夹名)
app_name=$(basename "$path")
echo "应用名称：$app_name" >> "$path/new_version.txt"
echo ""
echo "应用名称(默认为文件夹名)："
echo "$app_name"
echo ""


# 提示输入PES系统版本
while true; do
    echo -e "请输入该应用所支持的PES系统版本（1.0.3 or 2.0）:"
    read verer
    if [ -z "$verer" ]; then
        echo "PES系统版本未输入，请重新输入!"
    elif [[ "$verer" != "1.0.3" && "$verer" != "2.0" ]]; then
        echo "输入的版无效，请输入 1.0.3 或 2.0"
    else
        break
    fi
done
echo "系统版本：pes$verer" >> "$path/new_version.txt"
echo ""


# 提示输入应用架构
while true; do
    echo -e "请输入应用架构（x86 or aarch64）:"
    read arch
    if [ -z "$arch" ]; then
        echo "应用架构未输入，请重新输入!"
    elif [[ "$arch" != "x86" && "$arch" != "aarch64" ]]; then
        echo "输入的架构无效，请输入 x86 或 aarch64"
    else
        break
    fi
done
echo "应用架构：$arch" >> "$path/new_version.txt"
echo ""


# 提示输入应用来源
while true; do
    echo -e "请输入应用来源/公司名称:"
    read version_number
    if [ -z "$version_number" ]; then
        echo "应用来源未输入，请重新输入!"
    else
        break
    fi
done
echo "应用来源：$version_number" >> "$path/new_version.txt"
echo ""


# 提示输入版本号
while true; do
    echo -e "请输入版本号:"
    read version_number
    if [ -z "$version_number" ]; then
        echo "应用版本号未输入，请重新输入!"
    else
        break
    fi
done
echo "应用版本号：$version_number" >> "$path/new_version.txt"
echo ""


# 提示输入应用所需容量
while true; do
    echo -e "请输入应用所需容量 (单位: MB):"
    read app_size
    if [ -z "$app_size" ]; then
        echo "应用所需容量未输入，请重新输入!"
    else
        break
    fi
done
echo "应用所需容量：${app_size} MB" >> "$path/new_version.txt"
echo ""


# 提示输入应用所需内存，若为空则默认1024MB
echo -e "请输入应用所需内存 (单位: MB)，回车则默认1024MB: "
read -e memory
memory=${memory:-1024}
if [ "$memory" == "1024" ]; then
echo "1024"
fi
echo "应用所需内存：${memory} MB" >> "$path/new_version.txt"
echo ""


# 提示输入应用所需核数，回车则默认2核
echo -e "请输入应用所需核数，回车则默认2核: "
read -e cpu_cores
cpu_cores=${cpu_cores:-2}
if [ "$cpu_cores" == "2" ]; then
echo "2"
fi
echo "应用所需核数：$cpu_cores" >> "$path/new_version.txt"
echo ""


# 提示输入应用所需线程数，回车则默认4线程
echo -e "请输入应用所需线程数，回车则默认4线程: "
read -e threads
threads=${threads:-4}
if [ "$threads" == "4" ]; then
echo "4"
fi
echo "应用所需线程数：$threads" >> "$path/new_version.txt"
echo ""


echo "" >> "$path/new_version.txt"

directory="$path/package"
# 遍历目标目录中的每个文件，计算每个文件的 SHA-256，并计算该 SHA-256 值的 SHA-256
find "$directory" -type f | while read -r file; do

        # 计算每个文件的 SHA-256
        file_sha256=$(sha256sum "$file" | awk '{print $1}')

        # 将结果保存
        echo "$file_sha256" >> "$path/new_version.txt"
done

head -n 11 "$path/new_version.txt" | while read -r line; do
    sha256sum <<< "$line" | awk '{print $1}' >> "$path/new_version.txt"
done

echo ""
head -n 11 "$path/new_version.txt"
echo ""
echo "请核对当前显示的应用信息，若信息无误点击 回车 打包应用；"
echo "若信息存在错误，请按下 Ctrl+c 退出应用程序，重新启动pack并执行信息输入步骤。"

read


rm -f "$path/version.txt"
mv "$path/new_version.txt" "$path/.version"


echo ""
tar -czvf "${app_name}_v1_${arch}_${type}_${version_number}.tar.gz" "$app_name"
if [ $? -eq 0 ]; then
	echo ""
    echo "打包成功！文件名为 ${app_name}_v1_${arch}_${type}_${version_number}.tar.gz"
	echo ""
else
	echo ""
    echo "打包失败"
	echo ""
fi
